package com.example.simpledemo1.aggregate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: ZhangLiang
 * @Date: 2021/07/01/22:52
 * @Description: 数组转集合推荐方式
 */
public class ArrayToList {

    public static void main(String[] args) {
//        方式一:不推荐使用
//        arrayToList1();

//      方式二:自定义转换方法,实践使用
        List a=arrayToList2(new String[]{"1","2","3"});
        System.out.println(a);
        a.add("4");
        System.out.println(a);

//      方式三:最简单的方法，推荐
        List list=new ArrayList<>(Arrays.asList("1","2","4"));
        list.add("6");
        System.out.println(list);

//        方式四:使用 Java8 的Stream(推荐)

        Integer [] myArray = { 1, 2, 3 };
        List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本类型也可以实现转换（依赖boxed的装箱操作）
        int [] myArray2 = { 1, 2, 3 };
        List myList2 = Arrays.stream(myArray2).boxed().collect(Collectors.toList());
        System.out.println(myList);
        System.out.println(myList2);
    }


    public static void arrayToList1() {
        // 方式一 Arrays.asList(),不推荐使用,参数最好为对象,不是基本类型，不然对集合增删会异常
        int[] myArray = {1, 2, 3};
        List asList = Arrays.asList(myArray);
        // java.lang.UnsupportedOperationException
        //当传入一个原生数据类型数组时，Arrays.asList() 的真正得到的参数就不是数组中的元素，而是数组对象本身,所以大小为1，而不是集合本身
        System.out.println(asList.size());
//         asList.add("4");
//        优化，使用包装类型可以解决数组而不是集合的问题，但是增加还是会异常，是因为Arrays并未实现add方法
        Integer[] i = {1, 2, 3};
        List<Integer> asList2 = Arrays.asList(i);
        System.out.println(asList2.get(0));
        asList2.add(4);
        System.out.println(asList2);
    }

    //JDK1.5+

    /**
     * 方式二:自定义
     * @param array
     * @param <T>
     * @return
     */
    static <T> List<T> arrayToList2(final T[] array) {
        final List<T> l = new ArrayList<T>(array.length);

        for (final T s : array) {
            l.add(s);
        }
        return l;
    }
}
